#include <iostream>
// 声明函数模板
template <typename T, typename U>
void add(T a, U b)
{
    T c{a + b};
    std::cout << c << std::endl;
}
int main()
{
    // 1、模板实例化
        // void add(float a, int b)
        // {
        //     float c{a + b};
        //     std::cout << c << std::endl;
        // }
        // add<float, int>(1, 2); 运行时模板实例化如上
    // 如果实例化的结果是非法的（比如不存在对应的运算符重载、成员函数等），那么编译器会给出错误
    // 对于每一次不同的带模板实参的函数调用，都会实例化出不同的函数。
    // 如果出现多次带相同的模板实参的函数调用，则只会进行一次对应的实例化
    // 2、带模板实参
    add<float, int>(1, 2);
    add<float, int>(1, 2);
    add<int, int>(1, 2);
    // 3、函数模板实参推导，不用写自己推导
    add(1,5);
}